﻿using System.Text.RegularExpressions;

namespace Sgr.Utilities
{
    /// <summary>
    /// 正则表达式常用规则封装
    /// </summary>
    public static class RegexHelper
    {
        // 预编译正则表达式（提升性能）
        private static readonly Regex _emailRegex = new Regex(
            @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$",
            RegexOptions.Compiled);

        private static readonly Regex _phoneRegex = new Regex(
            @"^1[3-9]\d{9}$", // 中国大陆手机号
            RegexOptions.Compiled);

        private static readonly Regex _urlRegex = new Regex(
            @"^(https?|ftp)://[^\s/$.?#].[^\s]*$",
            RegexOptions.Compiled | RegexOptions.IgnoreCase);

        private static readonly Regex _ipv4Regex = new Regex(
            @"^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$",
            RegexOptions.Compiled);

        private static readonly Regex _chineseCharsRegex = new Regex(
            @"[\u4e00-\u9fa5]", // 中文字符
            RegexOptions.Compiled);

        // 新增：业务伙伴编码正则表达式
        private static readonly Regex _businessPartnerCodeRegex = new Regex(
            @"^[A-Za-z0-9\-_]+$", // 字母、数字、短横线和下划线
            RegexOptions.Compiled);

        // 新增：统一社会信用代码正则表达式
        private static readonly Regex _unifiedSocialCreditCodeRegex = new Regex(
            @"^[0-9A-HJ-NPQRTUWXY]{2}[0-9]{6}[0-9A-HJ-NPQRTUWXY]{10}$", // 18位统一社会信用代码
            RegexOptions.Compiled);

        // 新增：邮政编码正则表达式
        private static readonly Regex _postalCodeRegex = new Regex(
            @"^\d{6}$", // 6位数字
            RegexOptions.Compiled);

        // 新增：银行账户正则表达式（清理后的纯数字）
        private static readonly Regex _bankAccountDigitsRegex = new Regex(
            @"^\d+$", // 纯数字
            RegexOptions.Compiled);

        // 新增：银行账户相同数字检查正则表达式
        private static readonly Regex _bankAccountSameDigitsRegex = new Regex(
            @"^(\d)\1+$", // 全部相同数字
            RegexOptions.Compiled);

        // 新增：银行账户格式清理正则表达式
        private static readonly Regex _bankAccountCleanRegex = new Regex(
            @"[\s\-]", // 空格和短横线
            RegexOptions.Compiled);

        /// <summary>
        /// 验证字符串是否为有效邮箱
        /// </summary>
        public static bool IsValidEmail(string input)
        {
            return !string.IsNullOrEmpty(input) && _emailRegex.IsMatch(input);
        }

        /// <summary>
        /// 验证字符串是否为有效手机号（中国大陆）
        /// </summary>
        public static bool IsValidPhoneNumber(string input)
        {
            return !string.IsNullOrEmpty(input) && _phoneRegex.IsMatch(input);
        }

        /// <summary>
        /// 验证字符串是否为有效URL
        /// </summary>
        public static bool IsValidUrl(string input)
        {
            return !string.IsNullOrEmpty(input) && _urlRegex.IsMatch(input);
        }

        /// <summary>
        /// 验证字符串是否为IPv4地址
        /// </summary>
        public static bool IsValidIPv4(string input)
        {
            return !string.IsNullOrEmpty(input) && _ipv4Regex.IsMatch(input);
        }

        /// <summary>
        /// 验证统一社会信用代码格式
        /// </summary>
        /// <param name="input">统一社会信用代码</param>
        /// <returns>是否有效</returns>
        public static bool IsValidUnifiedSocialCreditCode(string input)
        {
            if (string.IsNullOrEmpty(input) || input.Length != 18)
                return false;

            return _unifiedSocialCreditCodeRegex.IsMatch(input);
        }

        /// <summary>
        /// 验证邮政编码格式（中国）
        /// </summary>
        /// <param name="input">邮政编码</param>
        /// <returns>是否有效</returns>
        public static bool IsValidPostalCode(string input)
        {
            return !string.IsNullOrWhiteSpace(input) && _postalCodeRegex.IsMatch(input);
        }

        /// <summary>
        /// 验证银行账户格式
        /// </summary>
        /// <param name="input">银行账户</param>
        /// <returns>是否有效</returns>
        public static bool IsValidBankAccount(string input)
        {
            if (string.IsNullOrWhiteSpace(input))
                return false;

            // 清理空格和短横线
            var cleanAccount = _bankAccountCleanRegex.Replace(input, "");

            // 检查长度（10-30位）
            if (cleanAccount.Length < 10 || cleanAccount.Length > 30)
                return false;

            // 检查是否全是数字
            if (!_bankAccountDigitsRegex.IsMatch(cleanAccount))
                return false;

            // 检查是否全是相同数字（如：1111111111）
            if (_bankAccountSameDigitsRegex.IsMatch(cleanAccount))
                return false;

            return true;
        }

        /// <summary>
        /// 提取字符串中的所有中文字符
        /// </summary>
        public static string ExtractChineseChars(string input)
        {
            if (string.IsNullOrEmpty(input))
                return string.Empty;

            var matches = _chineseCharsRegex.Matches(input);
            return string.Join("", matches.Select(m => m.Value));
        }

        /// <summary>
        /// 验证字符串是否包含中文字符
        /// </summary>
        /// <param name="input">输入字符串</param>
        /// <returns>是否包含中文字符</returns>
        public static bool ContainsChineseChars(string input)
        {
            return !string.IsNullOrEmpty(input) && _chineseCharsRegex.IsMatch(input);
        }

        /// <summary>
        /// 自定义正则验证
        /// </summary>
        /// <param name="input">输入字符串</param>
        /// <param name="pattern">正则表达式</param>
        /// <param name="options">可选：正则选项</param>
        public static bool Validate(string input, string pattern, RegexOptions options = RegexOptions.None)
        {
            return !string.IsNullOrEmpty(input) && Regex.IsMatch(input, pattern, options);
        }
    }
}